// 游离函数
function rectSquare(a, b) {
  return a * b;
}
function rectZhouChang(a, b) {
  return 2 * (a + b);
}
// 类
class Rect {
  //   对象的属性
  a = 3;
  b = 5;
  //   构造函数/方法
  constructor(a, b) {
    this.a = a;
    this.b = b;
  }
  //   对象的方法/函数
  calcSquare() {
    return this.a * this.b;
  }
  calcZhouchang() {
    return 2 * (this.a + this.b);
  }
}
function circleSquare(r) {
  return Math.PI * r ** 2;
  // Math.pow(4,1/2)
  //
}
class Circle {
  r = 1;
  constructor(r) {
    this.r = r;
  }
  calcSquare() {
    return this.r ** 2;
  }
}
function test01() {
  console.log(rectSquare(3, 3));
  console.log(rectSquare(4, 5));
  console.log(circleSquare(3));
  console.log(circleSquare(4));
  //   权威人士 定义一个通用调用方法 入参和返回值被预先确定类型和数量 接口
  //   calcSquare();
  //   第一步 实例化 第二步 调用业务方法
  let p = new Rect(3, 4);
  let q = p.calcSquare();
  console.log("pppp", q);
  console.log(new Rect(4, 5).calcSquare());
  let pp = new Circle(3);
  console.log(pp.calcSquare());
}
//
function test02() {
  let a = 33;
  let b = 22;

  console.log(rectSquare(a, b));
  console.log(rectZhouChang(a, b));

  let i = new Rect(a, b);
  console.log(i.calcSquare());
  console.log(i.calcZhouchang());
}

class Person {
  // 类的属性 静态属性
  static num = 12;
  // 类的方法 静态方法
  static run() {
    console.log("========",Person.num);
  }
//   产生对象的工厂 静态工厂
  static createDefaultPerson(){
    return new Person("default");
    // return new this("default");
  }
  //   对象的属性
  name = "John";
  age = "22";
  #hobby=["some","any"];
  //   构造函数
  constructor(name) {
    this.name = name;
  }
  //   对象的方法
  // 类里方法不要使用箭头函数
  shout() {
    console.log(this.name, this.age,this.#hobby);
  }
  //   不推荐
  //   laugh = function () {
  //     console.log(this.name, this.age);
  //   };
}
function test03() {
  console.log("-------",Person.num);
  Person.run();
  let p = new Person("xxx");
  console.log(p.age);
  p.shout();

  let q = new Person("yyy");
  console.log(q.age);
  q.shout();

  let s = Person.createDefaultPerson();
  s.age++;
  console.log(s.age);
  s.shout();
}

// -==============main==================
// test01();
// test02();
test03();
